#pragma once
#include "common.hpp"

const int fd = -1;

class NamePipe
{
public:
    NamePipe(const std::string &name) : _name(name), _fd(fd)
    {
    }

    // 创建管道
    bool Create()
    {
        // 创建命名管道文件
        // 成功返回0，失败返回-1
        int n = mkfifo(fifoname.c_str(), mode);
        if (n == 0)
        {
            std::cout << "mkfifo success" << std::endl;
        }
        else
        {
            // std::cout << "mkfifo failed" << std::endl;
            perror("mkfifo");
            return false;
        }
        return true;
    }

    bool OpenofRead()
    {
        // 以读方式打开管道文件
        // 只打开一端，open会陷入阻塞
        _fd = open(fifoname.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        std::cout << "open file success" << std::endl;
        return true;
    }

    bool OpenofWrite()
    {
        // 以写方式打开文件
        _fd = open(fifoname.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        return true;
    }
    // 输出参数: const &
    // 输入参数: *
    // 输入输出参数: &
    bool Read(std::string *out)
    {
        // 读取数据
        char buffer[SIZE] = {0};
        ssize_t num = read(_fd, buffer, sizeof(buffer) - 1);
        if (num > 0)
        {
            buffer[num] = 0;
            *out = buffer;
        }
        else if (num == 0)
        {
            return false;
        }
        else
        {
            return false;
        }
        return true;
    }

    void Write(const std::string &in)
    {
        write(_fd, in.c_str(), in.size());
    }

    // 关闭管道
    void Close()
    {
        if (_fd == fd)
            return;
        else
            close(_fd);
    }
    void Remove()
    {
        unlink(_name.c_str());
    }
    ~NamePipe() {}

private:
    std::string _name;
    int _fd;
};